파이썬을 잘 몰라도 따라오실 수 있습니다.
장고의 공식 예제를 통해 장고를 학습하고 나만의 사이트를 직접 구축해봅시다!
이 강의를 듣고 난 후 직접 자신만의 웹 서비스를 구축 할 수 있고, 개발하면서 얻는 지식으로 추후 웹 해킹이나, 다른 개발에도 도움이 많이 될 겁니다!
해당 정보를 기반으로 교육자료를 제작하였습니다.
- 난이도 : 1 ~ 2
- 실습 환경 : Ubuntu 20.04 LTS
- 프로그램 : Visual Code, Virtualbox
- 사용 언어 : Python, HTML, SQL
- 프래임워크 : Django
- 강의 기간 : 7월 5일을 시작일로 8월 11일 까지 매주 2일 2시간 강의를 목표로 한다.
- 얻어가는 지식 : Django, DB, Python, Cloud
개요베이스 지식 구축웹웹이란?HTMLCSSDjango데이터베이스데이터베이스란?DBMS란?SQL이란?네트워크 IPPORT리눅스리눅스란?mkdirlscdpwdtouchvicat개발 환경 구축Virtualbox 설치Ubuntu 가상 환경 구축SSH 연결 설정Windows에서 Ubuntu 가상환경에 SSH 연결VSCode 설치VSCode SSH Extensions 설치Python 설치하기virtualenv(가상 환경)가성환경 사용하기장고 설치Django 예제를 통해 공부Django 프로젝트 생성설정 변경어플리케이션 생성Django 모델블로그 글 모델 만들기데이터베이스에 모델을 위한 테이블 생성Django 관리자관리자 생성관리자 페이지Django urls and views템플릿의 동적 데이터CSS를 통해 더 예쁘게 만들기Bootstrap 사용Bootstrap 적용하기Django 정적 파일템플릿 확장하기기본 템플릿 생성하기
개요
이번시간에 우리는 자신의 블로그 사이트를 만드는 실습을 통해 웹서버, 리눅스. 데이터베이스를 알아 보도록 하겠습니다.
아마 이 수업을 다 들으시면 동아리, 개인 웹서버 정도는 가뿐히 유지보수 및 운영 가능하실 겁니다!
아무것도 모르는 사람들을 대상으로 진행하기 때문에 교육하는 과정에서 전문지식을 너무 깊게 들어가며 설명하지 않으려고 합니다!
상세하게 알고 싶으시면 따로 찾아와주세요. 언제든지 환영입니다 ㅎ
베이스 지식 구축
웹
웹이란?
간단히 말하자면 월드와이드 웹(World Wide Web)이란 인터넷에 연결된 사용자들이 서로의 정보를 공유할 수 있는 공간을 의미합니다.
우리는 이번 시간을 통해 웹사이트를 직접 구축해보겠습니다!
HTML
HTML은 Hyper Text Markup Language 웹을 이루는 가장 기초적인 구성 요소로, 웹 콘텐츠의 의미와 구조를 정의할 때 사용합니다.
My cat is very grumpy
라는 문장을 웹페이지 상에 표시하려 할 때 아래 사진과 같은 구조로 입력하며 됩니다.- 여는 태그(Opening tag): 이것은 요소의 이름과(이 경우 p), 열고 닫는 꺽쇠 괄호로 구성됩니다. 요소가 시작(이 경우 단락의 시작 부분)부터 효과가 적용되기 시작합니다.
- 닫는 태그(Closing tag): 이것은 요소의 이름 앞에 슬래시(/)가 있는것을 제외하면 여는 태그(opening tag)와 같습니다. 이것은 요소의 끝(이 경우 단락의 끝 부분)에 위치합니다.
- 내용(Content): 요소의 내용이며, 이 경우 단순한 텍스트이다.
- 요소(Element): 여는 태그, 닫는 태그, 내용을 통틀어 요소(element)라고한다.
HTML의 구조는 아래 사진 코드를 참고해서 이해해 봅시다.
사이트를 통해 HTML이 어떻게 동작하는지 알아보도록 하겠습니다.
CSS
CSS는 Cascading Style Sheets는 HTML 같은 문서의 스타일를 꾸밀 때 사용하는 스타일 시트 언어입니다.
css를 적용하는 방법은 아래 사이트를 통해 알아봅시다.
Django
장고는 python 기반의 오픈소스 웹 프레임워크입니다.
프레임워크를 간단히 설명하자면 자동차의 프레임, 즉 기본적으로 구성하고 있는 뼈대를 말합니다.
따라서 저희는 장고가 뼈대를 잡아주었기 때문에 살만 붙이면 되는것입니다.
현재 인스타그램, 번개장터, 라프텔 등등 많은 회사에서 장고를 이용해 서비스를 구축해 사용 중 입니다.
이번 기회를 통해 장고의 맛을 느껴 실력을 향상시키고 한번 취업을 노려보는것도 좋겠죠?
데이터베이스
데이터베이스란?
데이터베이스는 정보 집합체라고 보면 이해하기 쉽습니다.
DBMS란?
DBMS(DataBaseManagementSystem)는 데이터베이스 관리 시스템입니다.
다수의 사용자들이 데이터베이스 내의 데이터를 접근할 수 있도록 해주는 프로그램이고 보면 됩니다.
DBMS는 관계형 데이터베이스와 비관계형 데이터베이스가 존재하는데 지금은 이런게 있구나 하고 알아만 둡시다! (나중에 공부 꼭 해서 알아 둬야해요)
DBMS는 MySQL, MSSQL, SQLite3, Redis, MongoDB 등등이 있다. 이번 수업에서는 우리는 SQLite3를 이용한다.
SQL이란?
Structured Query Language의 약자이다.
SQL은 앞서 말한 관계형 데이터베이스에서 정보를 저장하고 처리하기 위한 프로그래밍 언어입니다.
SQL을 맛보기 위해서 잠깐 실습해볼까요?
자세한 설명보다는 코드를 직접 실행해보면서 이해해봅시다.
네트워크
IP
인터넷에 연결되어 있는 모든 장치들(컴퓨터, 서버 장비, 스마트폰 등)을 식별할 수 있도록
각각의 장비에게 부여되는 고유 주소입니다.
IP는 대부분 XXX.XXX.XXX.XXX 이런식으로 이루어져있습니다. ex) 192.168.0.1, 127.0.0.1
우리가 아는 유명한 웹사이트(네이버, 구글, 유튜브) 들도 사실은 XXX.XXX.XXX.XXX 형태의 주소로 이루어져 있습니다.
하지만 숫자 12자리를 외워서 웹사이트에 접속하는 것은 어려우니 사람들은 DNS라는 서비스를 개발하여 XXX.XXX.XXX.XXX → www.naver.com 이런식으로 변형 시켜 준 것입니다.
IP는 각 장치들 간 통신을 식별할 수 있는 전화번호라고 생각하면 쉬울겁니다.
PORT
하나의 컴퓨터에는 여러개의 서버가 설치 될 수 있습니다.
접속자가 여러개의 서버에 중 특정 서버에 접속할 때 구분이 할 수 있는 방법이 필요합니다.
그래서 생긴 것이 PORT입니다. IP 주소가 장비의 고유 주소라고 한다면, PORT는 서버의 주소라고 보면 됩니다. 아래는 가장 많이 쓰이는 포트 종류입니다.
- 20 : FTP(data)
- 21 : FTP(제어)
- 22 : SSH
- 23 : 텔넷
- 53 : DNS
- 80 : WEB HTTP
- 119 : NNTP
저희는 22번 ssh와 80번 http를 이용하려고 합니다.
리눅스
리눅스란?
Linux는 오픈소스 운영 체제(OS)입니다.
우리가 흔히 사용하는 윈도우랑 같은 용도라고 생각하시면 됩니다.
리눅스의 간단한 사용법 및 명령어를 아래 사이트를 통해 실습해 봅시다.
우리가 블로그를 만드는데 필요한 명령어들만 간단히 짚고 넘어가겠습니다.
mkdir
해당 명령어는 폴더를 생성하는 명령어입니다.
명령어를 터미널에 입력하게 되면 폴더가 생성됩니다.
ls
해당 명령어는 현재 위치에 있는 파일들을 보는 명령어입니다.
명령어를 터미널에 입력하게 되면 이전에 만들어 놓은 test폴더가 존재하는 것을 확인 할 수 있습니다.
cd
해당 명령어는 현재 위치를 이동하는 명령어입니다.
명령어를 터미널에 입력하게 되면 이전에 만들어 놓은 test 폴더로 이동됩니다.
pwd
해당 명령어는 현재 위치가 어딘지 확인하는 명령어입니다.
명령어를 입력하게 되면 우리가 이전에 test폴더로 이동했기 때문에 /home/cg/root/64953ddc3fb7c/test 터미널에 이런식으로 출력될 것 입니다.
touch
해당 명령어는 mkdir와 다르게 파일을 생성하는 명령어입니다.
명령어를 입력하고 ls를 입력하게 되면 파일이 생성되어있는것을 알 수 있습니다.
vi
해당 명령어는 파일을 생성, 편집 등을 하는 명령어 입니다.
대체하는
간단하게 설명 하면
- i 를 입력하면 INSERT 모드로 변경되어 편집이 가능합니다.
- :q 를 입력하면 vi 편집기를 나갈 수 있습니다.
- :w 를 입력하면 파일을 저장합니다.
cat
해당 명려어는 파일을 읽는 명령어입니다.
우리가 이전에 만든 hello.py를 읽어봅시다.
개발 환경 구축
Virtualbox 설치
Ubuntu 가상 환경 구축
파일을 다운받고 Virtulbox를 실행 시킨 뒤 추가를 눌러 다운받은 파일을 선택 해 준다.
ID : Ubuntu
PW : ubuntu
가상 환경에 Ubuntu가 확인 된 것을 알 수 있다.
SSH 연결 설정
실행 된 창에서 작업을 실행 해도 되지만~ 아마 나중에 해보시면 아시겠지만 매우 불편합니다 ㅠㅠ
그래서 우리는 더욱 더 빨리 편하게 개발을 하기 위해서 SSH를 이용 해주도록 하겠습니다.
우선 리눅스 명령어 ifconfig를 입력해주어 IP를 알아봅시다.
10.0.2.15 기억해 두세요!
SSH 연결을 하기 위해서는 포트 포워딩을 해줘야 됩니다!
Virtulbox 설정 → 네트워크 → Advanced → 포트 포워딩
아래 사진과 같이 설정해 주었다면 다 된것이다!
호스트 IP에 입력한 127.0.0.1 은 자신의 컴퓨터를 가르키는 IP 주소라고 보시면 됩니다!
Windows에서 Ubuntu 가상환경에 SSH 연결
Ubuntu 가상환경에서의 설정은 모두 해두었으니 이제 Windows에서 접속 해보겠습니다.
Win+R을 누르고 cmd를 입력해 테스트를 해보겠습니다.
해당 명령어를 입력해 접속해보자
성공적으로 접속 된것을 알 수 있다. cmd에서 접속 해 본것은 단순 테스트 용도이다.
VSCode 설치
해당 사이트에서 설치해 주면된다.
VSCode는 코딩 개발을 더욱 더 편하게 해줄 수 있는 프로그램이라고 보면 된다.
VSCode SSH Extensions 설치
VSCode에서도 SSH 연결을 할 수 있다.
우리가 이전에 설치한 Ubuntu와 연결하여 VSCode에서만 개발을 진행하도록 할 것이다.
아래 사진처럼 왼쪽부터 순서대로 진행해주면 된다.
설치가 완료되었으면 Ubuntu와의 ssh연결 설정을 해주도록 한다.
우선 F1을 누른뒤 remote-ssh:Add New ssh Host 라고 입력해 준다.
그 뒤 cmd에서 ssh연결 할 때 썼던 명령어를 그대로 적어주고 엔터를 두번 눌러준다.!
이런식으로 나오면 성공 한 것이다!
이제 본격적으로 Django를 이용하여 나만의 블로그를 제작하여 보자!
Python 설치하기
우리는 리눅스를 사용하기 때문에 아마 기본적으로 python이 설치 되어있을 것 입니다.
위 명령어를 통해 python이 제대로 설치 되어있는지 한번 확인해 주세요!
만약 설치가 안되어있다면
위 명령어를 통해 설치해 주시면 됩니다.
virtualenv(가상 환경)
다른 언어와 달리 파이썬에서는 일반적으로 프로젝트 별로 독립된 개발 환경을 구성하기 위해서 가상 환경 (virtual environment)을 이용하는데요.
venv
라는 내장 모듈을 통해서 쉽게 가상 환경을 만들 수 있으며 이를 통해 프로젝트 간 의존성 충돌 문제를 효과적으로 예방할 수 있습니다.우선 /home/ubuntu 디렉토리에 first_blog라는 디렉토리를 만들어 줍시다!
이제 myenv라는 가상환경을 만들어 봅시다.
가성환경 사용하기
다음과 같이 virtualenv을 실행하세요.
성공적으로 실행되었다면 아래 그림과 같이 바뀌었을 겁니다!
장고 설치
가상환경이 활성화 되어있는 상태에서 진행해주세요!
이런식으로 맨 밑줄에 Successfully installed 가 나오면 정상적으로 django가 설치 된겁니다!
Django 예제를 통해 공부
Django 프로젝트 생성
우선 프로젝트를 생성하기 전에 가상환경을 활성화 하였는지 꼭 확인해주세요!
mysite 라는 프로젝트를 제작해보겠습니다!
명령어를 입력할 때 뒤에 . 을 찍는 것을 잊지마세요!
정상적으로 명령어를 입력했으면 사진처럼 디렉토리와 파일이 생성 된 것을 확인 할 수 있습니다!
제대로 설치 되어있는지 확인하기 위해서 테스트를 진행해 보도로 합시다.
아래 명령어를 입력하면 django 웹 서버가 실행됩니다.
http://127.0.0.1:8000/ 해당 주소 접속했을때 아래와 같은 화면이 나옵니다!
설정 변경
mysite/settings.py를 조금 고쳐주도록 하겠습니다.
코드가 많아서 어려워 보일 수 있어도 천천히 읽어보면 어떤 코드인지 알 수 있습니다.
저희는 TIMEZONE와 STATIC 부분만 변경 해주도록 하겠습니다.
Ctrl + F 를 누르고 TIME_ZONE 치면 해방 부분의 코드로 바로 이동 가능 할 거에요.
이부분은 어려울 수 있으니깐 그냥 코드 추가해주고 넘어가도록 할게요~
데이터베이스 설정 부분은 건들지 않고 확인만 하도록 할게요. 우리는 sqlite3 인것을 확인하면 됩니다. 차후에 DB를 변경하고 싶으면 Django 공식 다큐먼트를 참고 해주세요.
어플리케이션 생성
이번엔 블로그 기능을 하는 어플리케이션을 만들어 볼거에요.
명령어를 친 뒤 한번 살펴보면 blog 폴더와 각종 파일들이 생성된 것을 알 수 있습니다.
어플리케이션을 만들어 주었으니 적용시키는 법도 알아봅시다.
mysite/settings.py 파일을 아래와 같이 코드를 추가해 줍시다.
Django 모델
첫번째로 우리는 블로그의 모든 글 정보를 저장하는 부분을 만들 거에요.
우리는 모델이라는 파일을 수정해 데이터베이스 구성을 해볼겁니다.
모델을 입력하면 그 내용이 데이터베이스에 저장됩니다. 데이터베이스에는 유저에 대한 정보나 여러분의 블로그 글 등등이 저장되어 있습니다.
블로그 글 모델 만들기
모델 파일은 전에 blog 어플리케이션을 만들면서 생성되었습니다.
blog/models.py에 블로그 글의 객체들을 추가해주도록 합시다.
기존 코드들을 모두 지운 뒤 아래 코드들을 모두 복사 붙여넣기 해주세요.
코드를 한번 알아봐야겠죠?
각각의 객체들은 속성을 지정해 주어야합니다. 위 코드에서 사용된 속성들의 설명입니다.
models.CharField
- 글자 수가 제한된 텍스트를 정의할 때 사용합니다. 글 제목같이 대부분의 짧은 문자열 정보를 저장할 때 사용합니다.
models.TextField
- 글자 수에 제한이 없는 긴 텍스트를 위한 속성입니다. 블로그 콘텐츠를 담기 좋겠죠?
models.DateTimeField
- 이것은 날짜와 시간을 의미합니다.
models.ForeignKey
- 다른 모델이 대한 링크를 의미합니다.
자세한 모델 생성에 대한 설명은 시간 관계상 생략하고 더 궁금하신 분들은 아래 사이트를 참고해주세요.
데이터베이스에 모델을 위한 테이블 생성
데이터베이스에 우리가 만들 Post 모델을 추가할 겁니다.
우선 장고에 적용하기 위해선 몇가지 단계를 거쳐야 합니다.
DB반영을 위한 마이그레이션 파일 생성
DB에 blog 모델 추가
Django 관리자
장고에서는 관리자 페이지를 지원하는데 해당 페이지는 데이터베이스를 추가, 수정, 삭제를 할 수 있어요.
관리자 페이지 : http://127.0.0.1:8000/admin/
관리자 생성
관리자 페이지는 우선 관리자를 생성해 주어야 접속이 가능합니다.
관리자 생성을 위해 vscode 터미널로 이동하여 명령어를 입력해 생성 해줍니다.
관리자 페이지
다시 python manager.py runserver를 한뒤 관리자 페이지로 들어가 로그인해볼까요?
로그인 성공적을 되었으면 아래 페이지가 나올 겁니다.
그런데 저희가 만들 blog가 보이지 않습니다.
그래서 blog/admin를 조금 수정해보도록 하겠습니다.
정상적으로 수정되었다면 아래와 같이 Blog가 추가되었을 겁니다.
Posts에 Add를 눌러 글을 작성해 볼까요?
이런식으로 글을 3개 정도 만들어 주세요!
Django urls and views
이번에는 장고의 urls의 대해 이해하면서 블로그의 첫번째 화면을 구성해 보겠습니다.
먼저 blog/urls.py라는 파일을 생성해 다음과 같이 작성합니다.
mysite/urls.py도 수정해 줍니다.
blog/views.py도 수정해 줍니다.
이렇게 작성을 해준 뒤 http://127.0.0.1/test/ 주소에 접속하여 보면 “hello nice to meet you”가 정상적으로 출력되는 것을 알 수 있습니다.
그럼 어떻게 저렇게 출력되는지 그림을 통해 간단히 이해를 해봅시다.
이해를 조금 더 쉽게하기 위해서 test2라는 페이지를 하나 만들어봅시다.
우선 blog/views.py를 수정하도록 하겠습니다.
다음은 blog/urls.py를 수정하도록 하겠습니다.
http://127.0.0.1/test2를 들어가보면
정상적으로 적용된 것을 볼 수 있습니다.
그림을 통해 간단히 보면 이런식이겠죠?
그럼 이제 블로그 글 목록 페이지를 작성해 봅시다. 페이지 이름은 post_list라고 하겠습니다.
blog/urls.py를 수정하도록 하겠습니다.
blog/views.py를 수정하도록 하겠습니다.
추가했으니 한번 접속해 볼까요?
오잉? 에러가 뜨네요? 잘 읽어보면 post_list.html 이라는 템플릿을 찾을 수가 없다고 하네요.
우리가 이전과는 다르게 httpresponse를 해주지 않고 render라는 기능을 사용해서 그런가 봐요.
여기서 HttpResponse는 페이지를 요청했을때 views.py에서 바로 페이지 출력 정보를 전송해주고 render는 기존에 만들어진 html파일을 가저와 보여준다고 생각하면 됩니다.
그럼 오류를 해결하기 위해서 post_list.html를 생성하여 봅시다. 이번엔 터미널을 이용해 생성해보겠습니다.
blog/templates/blog/post_list.html 코드를 붙여 넣어주세요.
post_list.html를 생성해 주었으니 이젠 에러가 해결 되었을 겁니다.
그런데 우리가 이전에 관리자 페이지에서 작성했던 글과 다르죠?
그럼 이제 데이터베이스에 저장되어있는 글을 가져와서 표현하는 것을 해봅시다.
템플릿의 동적 데이터
post_list에서 데이터베이스에 있는 글을 보여주고 템플릿에 넘기기 위해서 모델을 가져와야해요.
이제 blog/views.py를 모델을 가져오기 위해서 수정해보겠습니다.
지금은 이해가 잘 되지않아도 나중에 한번더 짚고 넘어가니깐 걱정마세요!
추가된 코드를 간단히 요약해보면 posts라는 변수에 Posts모델을 받아오는 것입니다.
이제 post_list.html에서 모델에서 가져온 데이터를 표현해보겠습니다. 기존 코드는 모두 지우고 시작할게요
이렇게만 입력하고 접속해서 어떻게 나오는지 확인해 봅시다.
제가 쓴 글들의 제목만 나오고 있습니다.
그럼 HTML도 같이 사용해서 코드를 수정 해 볼게요 우선은 복사 붙여넣기 해주세요
{% for %}
와 {% endfor %}
사이에 넣은 모든 것은 목록의 모든 객체를 반복하게 됩니다.이제 결과를 한번 확인 해 볼까요?
CSS를 통해 더 예쁘게 만들기
CSS(Cascading Style Sheets)는 HTML와 같이 마크업랭귀지(markup language)으로 쓰여진 웹사이트를 나타낼 때 사용하는 언어입니다
Bootstrap 사용
부트스트랩(Bootstrap)은 예쁜 웹사이트를 개발하기 위해 사용되는 가장 유명한 HTML과 CSS 프레임워크입니다.
Bootstrap 적용하기
/blog/templates/blog/post_list.html에 Bootstrap에서 지원하는 코드를 추가해 보겠습니다.
/blog/templates/blog/post_list.html 추가된 코드
결과 화면
음 아직까지는 많이 이뻐진지는 모르겠네요. 조금 더 건들여 볼까요?
Django 정적 파일
정적 파일은 CSS과 이미지 모두를 말합니다.
정적 파일의 특징은 콘텐츠 요청 내용이 필요없어 모든 유저들이 동일한 내용을 볼 수 있어요.
반대로 동적은 모든 유저들이 볼 수 없겠죠?
정적 파일을 만들어 화면을 더 이쁘게 구성해 봅시다.
static 폴더, css 폴더, blog.css를 만드세요.
blog/static/css/blog.css에 코드를 추가하세요.
css파일을 만들었으니 blog/templates/blog/post_list.html에 적용해 볼까요?
코드 맨 윗줄에 아래 코드를 추가해 주면 정적파일을 읽어 올 수 있습니다.
그리고 bootstrap을 추가한 것과 마찬가지로 blog.css를 추가해 줄 거에요.
한번 확인 해 볼까요?
이제 글꼴을 한번 바꿔 볼까요?
저는 Raleway 라는 폰트를 사용하려고 합니다.
blog.css 코드를 변경해 준 뒤 확인해 볼까요?
미세하지만 글꼴이 바뀐 것을 확인 할 수 있습니다.
이제 배경을 한번 변경해볼까요?
우선 post_list.html 을 조금 손 봐주어야 되요. header에 포함된 div와 body에 포함된 div에 이름을 지정해 주어 css를 나눠서 적용시켜 줄 거에요.
이제 css 파일을 수정해야겠죠? 아래 코드를 붙여 넣고 새로고침 해봅시다.
적용 화면
템플릿 확장하기
장고의 또 다른 멋진 기능은 템플릿 확장(template extending) 입니다. 무슨 뜻일까요? 바로 여러분의 웹사이트 안의 서로 다른 페이지에서 HTML의 일부를 동일하게 재사용 할 수 있다는 뜻이에요.
기본 템플릿 생성하기
기본 템플릿은 웹사이트 내 모든 페이지에 확장되어 사용되는 가장 기본적인 템플릿입니다.
blog/templates/blog 에 base.html 파일을 생성해 줍시다. 밑에 코드를 복사 붙여넣기 해주세요.
여러분이 만든 block은 템플릿 태그로 base.html을 확장한 이 블럭에 HTML을 추가할 수 있게 해줍니다. 어떻게 동작하는지 보여 드릴게요.
blog/tempalstes/blog/post_list.html 파일을 다시 엽니다. body 태그 안에 있는 모든 내용을 지우고 아래 코드를 추가해주세요.
새로고침해서 이제 화면이 정상적으로 나오는지 확인해 보세요.
여기까지 django를 맛보기로 알아보았습니다. 이제 본격적으로 한번 자신만의 블로그를 제작해 볼까요?